unit clsItemNotaVenda;

interface

uses
  Dm, dbtables, biblio, Sysutils, clsProduto, clsMovItemPedVenda, clsItemPedVenda, Grids, ADODB,
  provider, SqlExpr, dbclient, RxQuery;

type
  TItemNotaVenda = class(tobject)
  private
{$HINTS OFF}
    Nota_serie: string;
    Nota_numero: string;
    Ent_codigo: string;
    Itnv_item: string;
{$HINTS ON}
  public
    Notv_Numero: string; //recupera
    Notv_Serie: string; //recupera
    item_nota: string; //recupera
    Ref_serie: string;
    Ref_numero: string;
    Ref_ent_codigo: string;
    Ref_Itnv_item: string;
    Pro_codigo: string;
    Emp_codigo: string;
    Itnv_quantidade: double;
    Itnv_valorUnit: double;
    Itnv_aliqdesc: double;
    Itnv_aliqipi: double;
    Itnv_datafat: TDateTime;
    Itnv_comisrep: double;
    Itnv_customedio: double;
    Itnv_desc2: double;
    Itnv_desc3: double;
    Itnv_desc4: double;
    Itnv_desc5: double;
    Itnv_aliqicms: double;
    itnv_cst: string;
    Codf_Codigo: string;
    Icms_Codigo: string;
    Itnv_custo: double;
    Itnv_Observacao: string;
    Itnv_ICMS: Double;
    Itnv_IPI: Double;
    Itnv_EstoqueBaixado: string; //S ou N
    Itnv_ValorFrete: double;
    Itnv_DescontoItem: double;
    Itnv_BcalcIcms: Double;
    Itnv_BcalcIpi: Double;
    Itnv_BcalcIcmsSubs: Double;
    Itnv_IcmsSubs: Double;
    Itnv_AliqIcmsSubs: Double;
    Itnv_MargemSubs: Double;

    Itnv_CST_IPI: string;
    Itnv_COD_Enq: string;
    Itnv_CST_PIS: string;
    Itnv_BcalcPIS: Double;
    Itnv_AliqPIS_P: Double;
    Itnv_QT_BcALCPIS: Double;
    Itnv_AliqPIS_R: Double;
    Itnv_PIS: Double;
    Itnv_CST_COFINS: string;
    Itnv_BcalcCOFINS: Double;
    Itnv_AliqCOFINS_P: Double;
    Itnv_QT_BcalcCOFINS: Double;
    Itnv_AliqCOFINS_R: Double;
    Itnv_COFINS: Double;
    Hist_Codigo: string;
    Itnv_BcICMSstRetUFremet: Double;
    Itnv_ICMSstUFremet: Double;
    Itnv_BcICMSstUFdest: Double;
    Itnv_ICMSstUFdest: Double;
    Itnv_BCstRet: double;
    Itnv_ICMSstRet: double;
    Itnv_vProd: Double;
    Itnv_vFrete: Double;
    Itnv_vDesc: Double;
    Itnv_vOutras: Double;
    Itnv_pCredICMS: Double;
    Itnv_vSeguro: Double;
    Itnv_AliqRedBC: Double;
    Itnv_AliqBCop: Double;
    Itnv_CredICMSsn: Double;
    Itnv_AliqRedBCst: Double;
    Itnv_AliqDif: Double;
    Itnv_ICMSop: Double;
    Itnv_ICMSDif: Double;
    Itnv_SomaST: String;
    Itnv_DescICMS: Double;
    Itnv_DescPIS: Double;
    Itnv_DescCOFINS: Double;

    V_itnv_item: string;
    num_nota: string;
    Num_serie: string;
    procedure Recuperar_Nota(p_serie, p_nota, p_entidade: string; var sg: TStringGrid);
    function Gravar(p_nota_serie, p_Nota_numero, p_Ent_codigo, p_Itnv_item: string): Byte;
    function Gravar1(p_nota_serie, p_Nota_numero, p_Ent_codigo, p_Itnv_item: string): Byte;
    function Recuperar(p_nota_serie, p_Nota_numero, p_Ent_codigo, p_Itnv_item: string): Byte;
    function RecuperarNotaDev(p_nota_serie, p_Nota_numero, p_Ent_codigo: string; var p_cds: TClientDataSet): Byte;
    function Recuperar1(p_nota_serie, p_Nota_numero1, p_Nota_numero2, p_Ent_codigo, p_Itnv_item: string): Byte;
    procedure RecuperarPorNota2(P_q: TQuery; p_nota_serie, p_Nota_numero, p_Ent_codigo: string);
    function Excluir(p_nota_serie, p_Nota_numero, P_nota_numero2, p_Ent_codigo: string): Byte;
    function Tira_SaldoFatura(P_nota_numero, p_nota_Serie, p_Ent_codigo, P_Itnv_item: string): double;
    function Tira_SaldoFatura2(P_Ped_numero, P_Ped_Item: string): double;
    function EstornaDevolucao(ref_nota_serie, ref_Nota_numero, ref_nota_numero2, ref_Ent_codigo: string): Byte;
    function DevolucaoReferencia(P_nota_serie, P_Nota1, P_nota2, P_Ent_codigo, P_itnv_item, P_ref_nota_serie, P_ref_Nota_numero, P_ref_Ent_codigo, P_ref_itnv_item: string): Byte;
    procedure RecuperarPorNota(P_q: TQuery; p_nota_serie, p_Nota_numero, p_Ent_codigo: string);
    function Nota_Devolvida(Entidade, nota1, nota2, serie: string): boolean;
    function Item_Devolvido(Entidade, nota1, nota2, serie, item: string): boolean;
    function Nota_Devolvida1(Entidade, nota1, nota2, serie, sequencia: string; dataIni, dataFin: TDateTime): double;
    function Nota_Devolucao(Entidade, nota1, nota2, serie: string): boolean;
    procedure Tira_SaldoProduto(tipo: byte; Num_Nota, Num_serie, p_Ent_codigo: string; Data_Fat: TDateTime);
    procedure Coloca_SaldoProduto(tipo: byte; Num_Nota, Num_serie, p_Ent_codigo: string; Data_Fat: TDateTime);
    function Itens_IcmsDiferente(p_nota_serie, p_nota_numero, p_ent_codigo: string; var xaliq_icms: double): boolean;
    function Itens_IPIDiferente(p_nota_serie, p_nota_numero, p_ent_codigo: string; var xaliq_icms: double): boolean;
    function Itens_CFOPDiferente(p_nota_serie, p_nota_numero, p_ent_codigo: string): boolean;
    function Nota_SemItem(p_nota_serie, p_nota_numero, p_ent_codigo: string): boolean;
    function RecuperaDesItem(p_nota_serie, p_nota_numero, p_ent_codigo, p_Item: string): string;
    function RecuperaDesItem1(p_nota_serie, p_nota_numero, p_ent_codigo, p_Prod: string): string;
    function RecuperaEstoqueBaixado(p_nota_serie, p_nota_numero, p_ent_codigo, p_Item: string): Boolean;
    function RecuperaValorRetornoRemessa(p_nota_serie, p_nota_numero, p_ent_codigo: string; p_Tipo: Byte): Double;
    //procedure Coloca_SaldoProduto(Num_Nota,Num_serie, p_Ent_codigo:String);
    //procedure Recuperar_Itens(var sg: TStringGrid; p_Notac_numero,p_notc_serie, p_Ent_codigo:String; controla_produto: boolean);
    //procedure Consultar(var p_q:TQuery; p_Notac_numero,p_notc_serie, p_Ent_codigo:String);
  end;

implementation

uses
  clsItem_Assistencia, clsFase_Assistencia, clsFichaProduto, clsBackupVenda, dm1, clsParametros, DB,
  clsProdutoEntidade, menu;

{ TItemNotaVenda }

function TItemNotaVenda.Excluir(p_nota_serie, p_Nota_numero,
  P_nota_numero2, p_Ent_codigo: string): Byte;
var
  tq: TQuery;
begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.db.DatabaseName;
  tq.Active := False;
  tq.close;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('DELETE FROM ItemNotaVenda where (Nota_numero=:K_Nota_Numero or Nota_numero=:K_nota_numero2) and Nota_serie=:K_Nota_serie and Ent_codigo=:k_Ent_codigo');
  tq.ParamByName('k_Nota_numero').AsString := StrZero(p_Nota_numero, 9);
  tq.ParamByName('k_Nota_numero2').AsString := StrZero(P_nota_numero2, 9);
  tq.ParamByName('k_Nota_serie').AsString := p_nota_serie;
  tq.ParamByName('k_Ent_codigo').AsString := strzero(p_Ent_codigo, 5);
  GeraLog('ITEMNOTAVENDA', 'Excluir');
  tq.execSQL;
  Result := 1;
  tq.close;
  tq.Free;
end;

function TItemNotaVenda.Gravar(p_nota_serie, p_Nota_numero, p_Ent_codigo,
  p_Itnv_item: string): Byte;
var
  tq: TQuery;
  xsql: string;
begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := False;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('SELECT * FROM ItemNotaVenda where Nota_serie=:K_Nota_serie and Nota_numero=:k_Nota_numero and Ent_codigo=:k_Ent_codigo and Itnv_item=:k_Itnv_item');
  tq.ParamByName('k_Nota_serie').AsString := p_nota_serie;
  tq.ParamByName('k_Nota_numero').AsString := StrZero(p_Nota_numero, 9);
  tq.ParamByName('k_Ent_codigo').AsString := StrZero(p_Ent_codigo, 5);
  tq.ParamByName('k_Itnv_item').AsString := StrZero(p_Itnv_item, 2);
  tq.Open;
  if tq.eof then begin
    xsql := '';
    tq.SQL.Clear;
    tq.Params.Clear;
    xsql := 'INSERT INTO ItemNotaVenda(NOTA_SERIE,NOTA_NUMERO,ENT_CODIGO,ITNV_ITEM,' +
      'REF_SERIE,REF_NUMERO,REF_ENT_CODIGO,REF_ITNV_ITEM,PRO_CODIGO,EMP_CODIGO,' +
      'ITNV_QUANTIDADE,ITNV_VALORUNIT,ITNV_ALIQDESC,ITNV_ALIQIPI,ITNV_DATAFAT,' +
      'ITNV_COMISREP,ITNV_CUSTOMEDIO,ITNV_DESC2,ITNV_DESC3,ITNV_DESC4,ITNV_DESC5,' +
      'ITNV_ALIQICMS,ITNV_CST,CODF_CODIGO,ICMS_CODIGO,ITNV_CUSTO,ITNV_Observacao,Itnv_ICMS,' +
      'Itnv_IPI,Itnv_EstoqueBaixado, Itnv_ValorFrete, Itnv_DescontoItem, Itnv_BcalcIcms, Itnv_BcalcIpi, Itnv_BcalcIcmsSubs, ' +
      'Itnv_IcmsSubs, Itnv_AliqIcmsSubs, Itnv_MargemSubs, Itnv_CST_IPI, Itnv_COD_Enq, Itnv_CST_PIS,' +
      'Itnv_BcalcPIS, Itnv_AliqPIS_P, Itnv_QT_BcALCPIS, Itnv_AliqPIS_R, Itnv_PIS, Itnv_CST_COFINS,' +
      'Itnv_BcalcCOFINS,Itnv_AliqCOFINS_P,Itnv_QT_BcalcCOFINS,Itnv_AliqCOFINS_R,Itnv_COFINS,Hist_Codigo,' +
      'Itnv_BcICMSstRetUFremet, Itnv_ICMSstUFremet, Itnv_BcICMSstUFdest, Itnv_ICMSstUFdest, Itnv_BCstRet, Itnv_ICMSstRet, ' +
      'Itnv_vProd, Itnv_vFrete, Itnv_vDesc, Itnv_vOutras, Itnv_pCredICMS, Itnv_vSeguro, Itnv_AliqRedBC, Itnv_AliqBCop, Itnv_CredICMSsn, ' +
      'Itnv_AliqRedBCst, Itnv_AliqDif, Itnv_ICMSop, Itnv_ICMSDif, Itnv_SomaST, Itnv_DescICMS, Itnv_DescPIS, Itnv_DescCOFINS ) ' +
      ' VALUES(:k_Nota_serie,' +
      ':k_Nota_numero,' +
      ':k_Ent_codigo,' +
      ':k_Itnv_item,';
    if Ref_numero <> '' then
      xsql := xsql + ':K_ref_serie,' +
        ':K_ref_numero,' +
        ':K_ref_ent_codigo,' +
        ':K_ref_itnv_item,'
    else
      xsql := xsql + 'null,' +
        'null,' +
        'null,' +
        'null,';
    xsql := xsql + ':k_Pro_codigo,' +
      ':K_Emp_codigo,' +
      ':k_Itnv_quantidade,' +
      ':k_Itnv_valorunit,' +
      ':K_Itnv_aliqdesc,' +
      ':k_Itnv_aliqipi,' +
      ':K_Itnv_datafat,' +
      ':K_Itnv_comisrep,' +
      ':K_Itnv_customedio,' +
      ':K_Itnv_desc2,' +
      ':K_Itnv_desc3,' +
      ':K_Itnv_desc4,' +
      ':K_Itnv_desc5,' +
      ':K_Itnv_aliqicms,' +
      ':K_Itnv_cst,';
    if Codf_Codigo <> '' then
      xsql := xsql + ':K_Codf_Codigo, '
    else
      xsql := xsql + 'null, ';

    if Icms_Codigo <> '' then
      xsql := xsql + ':K_Icms_Codigo, '
    else
      xsql := xsql + 'null, ';

    xsql := xsql + ':K_Itnv_custo, ' +
      ':K_Itnv_Observacao, ' +
      ':k_Itnv_ICMS, ' +
      ':k_Itnv_IPI, ' +
      ':k_Itnv_EstoqueBaixado, ' +
      ':k_Itnv_ValorFrete, ' +
      ':k_Itnv_DescontoItem, ' +
      ':k_Itnv_BcalcIcms, ' +
      ':k_Itnv_BcalcIpi, ' +
      ':k_Itnv_BcalcIcmsSubs, ' +
      ':k_Itnv_IcmsSubs, ' +
      ':k_Itnv_AliqIcmsSubs, ' +
      ':k_Itnv_MargemSubs,' +
      ':k_Itnv_CST_IPI,' +
      ':k_Itnv_COD_Enq,' +
      ':k_Itnv_CST_PIS,' +
      ':k_Itnv_BcalcPIS,' +
      ':k_Itnv_AliqPIS_P,' +
      ':k_Itnv_QT_BcALCPIS,' +
      ':k_Itnv_AliqPIS_R,' +
      ':k_Itnv_PIS,' +
      ':k_Itnv_CST_COFINS,' +
      ':k_Itnv_BcalcCOFINS,' +
      ':k_Itnv_AliqCOFINS_P,' +
      ':k_Itnv_QT_BcalcCOFINS,' +
      ':k_Itnv_AliqCOFINS_R,' +
      ':k_Itnv_COFINS,';
    if Hist_Codigo <> '' then
      xsql := xsql + (':k_Hist_Codigo,')
    else
      xsql := xsql + ('null,');
    xsql := xsql + ':k_Itnv_BcICMSstRetUFremet, :k_Itnv_ICMSstUFremet, :k_Itnv_BcICMSstUFdest, :k_Itnv_ICMSstUFdest, :k_Itnv_BCstRet, :k_Itnv_ICMSstRet, ' +
      ':k_Itnv_vProd, :k_Itnv_vFrete, :k_Itnv_vDesc, :k_Itnv_vOutras, :k_Itnv_pCredICMS, :k_Itnv_vSeguro, :k_Itnv_AliqRedBC, :k_Itnv_AliqBCop, :k_Itnv_CredICMSsn, ' +
      ':k_Itnv_AliqRedBCst, :k_Itnv_AliqDif, :k_Itnv_ICMSop, :k_Itnv_ICMSDif, :k_Itnv_SomaST, :k_Itnv_DescICMS, :k_Itnv_DescPIS, :k_Itnv_DescCOFINS )';
    tq.SQL.add(xsql);
  end else begin
    tq.SQL.Clear;
    tq.Params.Clear;
    tq.SQL.add('UPDATE ItemNotaVenda SET ');
    if Ref_numero <> '' then
      tq.SQL.add('Ref_serie     =:k_Ref_serie,' +
        'Ref_numero    =:K_Ref_numero,' +
        'Ref_ent_codigo=:k_Ref_ent_codigo,' +
        'Ref_Itnv_item =:k_Ref_Itnv_item,')
    else
      tq.SQL.add('Ref_serie     =null,' +
        'Ref_numero    =null,' +
        'Ref_ent_codigo=null,' +
        'Ref_Itnv_item =null,');
    tq.SQL.add('Pro_codigo     =:k_Pro_codigo,' +
      'Emp_codigo        =:K_Emp_codigo,' +
      'Itnv_quantidade   =:k_Itnv_quantidade,' +
      'Itnv_valorUnit    =:k_Itnv_valorUnit,' +
      'Itnv_aliqdesc     =:K_Itnv_aliqdesc,' +
      'Itnv_aliqipi      =:k_Itnv_aliqipi,' +
      'Itnv_datafat      =:k_Itnv_datafat,' +
      'Itnv_comisrep     =:k_Itnv_comisrep,' +
      'Itnv_customedio   =:k_Itnv_customedio,' +
      'Itnv_desc2        =:K_Itnv_desc2,' +
      'Itnv_desc3        =:K_Itnv_desc3,' +
      'Itnv_desc4        =:K_Itnv_desc4,' +
      'Itnv_desc5        =:K_Itnv_desc5,' +
      'Itnv_aliqicms     =:K_Itnv_aliqicms,' +
      'Itnv_cst          =:K_Itnv_cst,');
    if Codf_Codigo <> '' then
      tq.SQL.add('Codf_Codigo      =:K_Codf_Codigo,')
    else
      tq.SQL.add('Codf_Codigo      =:null,');

    if Icms_Codigo <> '' then
      tq.SQL.add('Icms_Codigo      =:K_Icms_Codigo, ')
    else
      tq.SQL.add('icms_codigo      =null,');

    tq.SQL.add('Itnv_custo        =:K_Itnv_custo,' +
      'Itnv_Observacao =:K_Itnv_Observacao, ' +
      'Itnv_ICMS =:k_Itnv_ICMS, ' +
      'Itnv_IPI =:k_Itnv_IPI, ' +
      'Itnv_EstoqueBaixado=:k_Itnv_EstoqueBaixado, ' +
      'Itnv_ValorFrete=:k_Itnv_ValorFrete, ' +
      'Itnv_DescontoItem = :k_Itnv_DescontoItem, ' +
      'Itnv_BcalcIcms = :k_Itnv_BcalcIcms, ' +
      'Itnv_BcalcIpi = :k_Itnv_BcalcIpi, ' +
      'Itnv_BcalcIcmsSubs = :k_Itnv_BcalcIcmsSubs, ' +
      'Itnv_IcmsSubs =:k_Itnv_IcmsSubs, ' +
      'Itnv_AliqIcmsSubs =:k_Itnv_AliqIcmsSubs, ' +
      'Itnv_MargemSubs =:k_Itnv_MargemSubs, ' +
      'Itnv_CST_IPI =:k_Itnv_CST_IPI, ' +
      'Itnv_COD_Enq =:k_Itnv_COD_Enq, ' +
      'Itnv_CST_PIS =:k_Itnv_CST_PIS,' +
      'Itnv_BcalcPIS =:k_Itnv_BcalcPIS,' +
      'Itnv_AliqPIS_P =:k_Itnv_AliqPIS_P,' +
      'Itnv_QT_BcALCPIS =:k_Itnv_QT_BcALCPIS,' +
      'Itnv_AliqPIS_R =:k_Itnv_AliqPIS_R,' +
      'Itnv_PIS =:k_Itnv_PIS,' +
      'Itnv_CST_COFINS =:k_Itnv_CST_COFINS,' +
      'Itnv_BcalcCOFINS =:k_Itnv_BcalcCOFINS,' +
      'Itnv_AliqCOFINS_P =:k_Itnv_AliqCOFINS_P,' +
      'Itnv_QT_BcalcCOFINS =:k_Itnv_QT_BcalcCOFINS,' +
      'Itnv_AliqCOFINS_R =:k_Itnv_AliqCOFINS_R,' +
      'Itnv_COFINS =:k_Itnv_COFINS,');
    if Hist_Codigo <> '' then
      tq.SQL.Add('Hist_Codigo =:k_Hist_Codigo, ')
    else
      tq.SQL.Add('Hist_Codigo = null, ');
    tq.SQL.Add('Itnv_BcICMSstRetUFremet =:k_Itnv_BcICMSstRetUFremet, Itnv_ICMSstUFremet =:k_Itnv_ICMSstUFremet, ' +
      'Itnv_BcICMSstUFdest =:k_Itnv_BcICMSstUFdest, Itnv_ICMSstUFdest=:k_Itnv_ICMSstUFdest, Itnv_BCstRet=:k_Itnv_BCstRet, Itnv_ICMSstRet=:k_Itnv_ICMSstRet, ' +
      'Itnv_vProd = :k_Itnv_vProd, Itnv_vFrete = :k_Itnv_vFrete, Itnv_vDesc = :k_Itnv_vDesc, Itnv_vOutras =:k_Itnv_vOutras, Itnv_pCredICMS = :k_Itnv_pCredICMS, ' +
      'Itnv_vSeguro=:k_Itnv_vSeguro, Itnv_AliqRedBC = :k_Itnv_AliqRedBC, Itnv_AliqBCop =:k_Itnv_AliqBCop, Itnv_CredICMSsn =:k_Itnv_CredICMSsn, Itnv_AliqRedBCst =:k_Itnv_AliqRedBCst, ' +
      'Itnv_AliqDif =:k_Itnv_AliqDif, Itnv_ICMSop =:k_Itnv_ICMSop, Itnv_ICMSDif =:k_Itnv_ICMSDif, Itnv_SomaST =:k_Itnv_SomaST, Itnv_DescICMS =:k_Itnv_DescICMS, '+
      'Itnv_DescPIS =:k_Itnv_DescPIS, Itnv_DescCOFINS =:k_Itnv_DescCOFINS ');
    tq.SQL.Add('WHERE Nota_serie=:K_nota_serie and Nota_numero=:k_Nota_numero and Ent_codigo=:k_Ent_codigo and Itnv_item=:k_Itnv_item');
  end;
  tq.ParamByName('K_Nota_serie').AsString := p_nota_serie;
  tq.ParamByName('K_Nota_numero').AsString := StrZero(p_Nota_numero, 9);
  tq.ParamByName('K_Ent_codigo').AsString := StrZero(p_Ent_codigo, 5);
  tq.ParamByName('K_Itnv_item').AsString := StrZero(p_Itnv_item, 2);
  if Ref_numero <> '' then begin
    tq.ParamByName('K_Ref_serie').AsString := Ref_serie;
    tq.ParamByName('K_Ref_numero').AsString := StrZero(Ref_numero, 9);
    tq.ParamByName('K_Ref_ent_codigo').AsString := StrZero(Ref_ent_codigo, 5);
    tq.ParamByName('K_Ref_Itnv_item').AsString := StrZero(Ref_Itnv_item, 2);
  end;
  tq.ParamByName('K_Pro_codigo').AsString := Pro_codigo;
  tq.ParamByName('K_Emp_codigo').AsString := Emp_codigo;
  tq.ParamByName('K_Itnv_quantidade').AsFloat := Itnv_quantidade;
  tq.ParamByName('K_Itnv_valorUnit').AsFloat := Itnv_valorUnit;
  tq.ParamByName('K_Itnv_aliqdesc').AsFloat := Itnv_aliqdesc;
  tq.ParamByName('K_Itnv_aliqipi').AsFloat := Itnv_aliqipi;
  tq.ParamByName('K_Itnv_datafat').AsDateTime := Itnv_datafat;
  tq.ParamByName('K_Itnv_comisrep').AsFloat := Itnv_comisrep;
  tq.ParamByName('K_Itnv_customedio').AsFloat := Itnv_customedio;
  tq.ParamByName('K_Itnv_desc2').AsFloat := Itnv_desc2;
  tq.ParamByName('K_Itnv_desc3').AsFloat := Itnv_desc3;
  tq.ParamByName('K_Itnv_desc4').AsFloat := Itnv_desc4;
  tq.ParamByName('K_Itnv_desc5').AsFloat := Itnv_desc5;
  tq.ParamByName('K_Itnv_aliqicms').AsFloat := Itnv_aliqicms;
  tq.ParamByName('K_Itnv_cst').AsString := Itnv_cst;
  if Trim(Codf_Codigo) <> '' then
    tq.ParamByName('K_Codf_Codigo').AsString := trim(Codf_Codigo);
  if Icms_Codigo <> '' then
    tq.ParamByName('K_Icms_Codigo').AsString := Icms_Codigo;
  tq.ParamByName('K_Itnv_custo').asfloat := Itnv_custo;
  tq.ParamByName('K_Itnv_Observacao').AsString := Itnv_Observacao;
  tq.ParamByName('k_Itnv_ICMS').AsFloat := Itnv_ICMS;
  tq.ParamByName('k_Itnv_IPI').AsFloat := Itnv_IPI;
  tq.ParamByName('k_Itnv_EstoqueBaixado').AsString := Itnv_EstoqueBaixado;
  tq.ParamByName('k_Itnv_ValorFrete').AsFloat := Itnv_ValorFrete;
  tq.ParamByName('k_Itnv_DescontoItem').AsFloat := Itnv_DescontoItem;
  tq.ParamByName('k_Itnv_BcalcIcms').AsFloat := Itnv_BcalcIcms;
  tq.ParamByName('k_Itnv_BcalcIpi').AsFloat := Itnv_BcalcIpi;
  tq.ParamByName('k_Itnv_BcalcIcmsSubs').AsFloat := Itnv_BcalcIcmsSubs;
  tq.ParamByName('k_Itnv_IcmsSubs').AsFloat := Itnv_IcmsSubs;
  tq.ParamByName('k_Itnv_AliqIcmsSubs').AsFloat := Itnv_AliqIcmsSubs;
  tq.ParamByName('k_Itnv_MargemSubs').AsFloat := Itnv_MargemSubs;
  tq.ParamByName('k_Itnv_CST_IPI').AsString := Itnv_CST_IPI;
  tq.ParamByName('k_Itnv_COD_Enq').AsString := Itnv_COD_Enq;
  tq.ParamByName('k_Itnv_CST_PIS').AsString := Itnv_CST_PIS;
  tq.ParamByName('k_Itnv_BcalcPIS').AsFloat := Itnv_BcalcPIS;
  tq.ParamByName('k_Itnv_AliqPIS_P').AsFloat := Itnv_AliqPIS_P;
  tq.ParamByName('k_Itnv_QT_BcALCPIS').AsFloat := Itnv_QT_BcALCPIS;
  tq.ParamByName('k_Itnv_AliqPIS_R').AsFloat := Itnv_AliqPIS_R;
  tq.ParamByName('k_Itnv_PIS').AsFloat := Itnv_PIS;
  tq.ParamByName('k_Itnv_CST_COFINS').AsString := Itnv_CST_COFINS;
  tq.ParamByName('k_Itnv_BcalcCOFINS').AsFloat := Itnv_BcalcCOFINS;
  tq.ParamByName('k_Itnv_AliqCOFINS_P').AsFloat := Itnv_AliqCOFINS_P;
  tq.ParamByName('k_Itnv_QT_BcalcCOFINS').AsFloat := Itnv_QT_BcalcCOFINS;
  tq.ParamByName('k_Itnv_AliqCOFINS_R').AsFloat := Itnv_AliqCOFINS_R;
  tq.ParamByName('k_Itnv_COFINS').AsFloat := Itnv_COFINS;
  if Hist_Codigo <> '' then
    tq.ParamByName('k_Hist_Codigo').AsString := Hist_Codigo;
  tq.ParamByName('K_Itnv_BcICMSstRetUFremet').AsFloat := Itnv_BcICMSstRetUFremet;
  tq.ParamByName('k_Itnv_ICMSstUFremet').AsFloat := Itnv_ICMSstUFremet;
  tq.ParamByName('k_Itnv_BcICMSstUFdest').AsFloat := Itnv_BcICMSstUFdest;
  tq.ParamByName('k_Itnv_ICMSstUFdest').AsFloat := Itnv_ICMSstUFdest;
  tq.ParamByName('k_Itnv_BCstRet').AsFloat := Itnv_BCstRet;
  tq.ParamByName('k_Itnv_ICMSstRet').AsFloat := Itnv_ICMSstRet;
  tq.ParamByName('k_Itnv_vProd').AsFloat := Itnv_vProd;
  tq.ParamByName('k_Itnv_vFrete').AsFloat := Itnv_vFrete;
  tq.ParamByName('k_Itnv_vDesc').AsFloat := Itnv_vDesc;
  tq.ParamByName('k_Itnv_vOutras').AsFloat := Itnv_vOutras;
  tq.ParamByName('k_Itnv_pCredICMS').AsFloat := Itnv_pCredICMS;
  tq.ParamByName('k_Itnv_vSeguro').AsFloat := Itnv_vSeguro;
  tq.ParamByName('k_Itnv_AliqRedBC').AsFloat := Itnv_AliqRedBC;
  tq.ParamByName('k_Itnv_AliqBCop').AsFloat := Itnv_AliqBCop;
  tq.ParamByName('k_Itnv_CredICMSsn').AsFloat := Itnv_CredICMSsn;
  tq.ParamByName('k_Itnv_AliqRedBCst').AsFloat := Itnv_AliqRedBCst;
  tq.ParamByName('k_Itnv_AliqDif').AsFloat := Itnv_AliqDif;
  tq.ParamByName('k_Itnv_ICMSop').AsFloat := Itnv_ICMSop;
  tq.ParamByName('k_Itnv_ICMSDif').AsFloat := Itnv_ICMSDif;
  tq.ParamByName('k_Itnv_SomaST').AsString:= Itnv_SomaST;
  tq.ParamByName('k_Itnv_DescICMS').AsFloat:= Itnv_DescICMS;
  tq.ParamByName('k_Itnv_DescPIS').AsFloat:= Itnv_DescPIS;
  tq.ParamByName('k_Itnv_DescCOFINS').AsFloat:= Itnv_DescCOFINS;
  GeraLog('ITEMNOTAVENDA', 'Gravar');
  tq.ExecSQL;
  Result := 1;
  tq.close;
  tq.Free;
end;

function TItemNotaVenda.Recuperar(p_nota_serie, p_Nota_numero, p_Ent_codigo, p_Itnv_item: string): Byte;
var
  tq: TQuery;
begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := False;
  tq.SQL.Clear;
  tq.SQL.add('SELECT * FROM ItemNotaVenda where Nota_numero=:k_Nota_numero and Nota_serie=:K_Nota_serie and Ent_codigo=:k_Ent_codigo and Itnv_item=:k_Itnv_item');
  tq.ParamByName('K_Nota_numero').AsString := StrZero(p_Nota_numero, 9);
  tq.ParamByName('K_Nota_serie').AsString := p_nota_serie;
  tq.ParamByName('K_Ent_codigo').AsString := strzero(p_Ent_codigo, 5);
  tq.ParamByName('K_Itnv_item').AsString := StrZero(p_Itnv_item, 2);
  tq.Open;
  if tq.eof then begin
    Ref_serie := '';
    Ref_numero := '';
    Ref_ent_codigo := '';
    Ref_Itnv_item := '';
    Pro_codigo := '';
    Emp_codigo := '';
    Itnv_quantidade := 0;
    Itnv_valorUnit := 0;
    Itnv_aliqdesc := 0;
    Itnv_aliqipi := 0;
    Itnv_datafat := date;
    Itnv_comisrep := 0;
    Itnv_customedio := 0;
    Itnv_desc2 := 0;
    Itnv_desc3 := 0;
    Itnv_desc4 := 0;
    Itnv_desc5 := 0;
    Itnv_aliqicms := 0;
    Itnv_cst := '';
    Codf_Codigo := '';
    Icms_Codigo := '';
    Itnv_custo := 0;
    Itnv_Observacao := '';
    Itnv_ICMS := 0;
    Itnv_IPI := 0;
    Itnv_EstoqueBaixado := '';
    Itnv_ValorFrete := 0;
    Result := 0;
  end else begin
    Ref_serie := tq.fieldbyname('Ref_serie').AsString;
    Ref_numero := tq.fieldbyname('Ref_numero').AsString;
    Ref_ent_codigo := tq.fieldbyname('Ref_ent_codigo').AsString;
    Ref_Itnv_item := tq.fieldbyname('Ref_Itnv_item').AsString;
    Pro_codigo := tq.fieldbyname('Pro_codigo').AsString;
    Emp_codigo := tq.fieldbyname('Emp_codigo').AsString;
    Itnv_quantidade := tq.fieldbyname('Itnv_quantidade').AsFloat;
    Itnv_valorUnit := tq.fieldbyname('Itnv_valorUnit').AsFloat;
    Itnv_aliqdesc := tq.fieldbyname('Itnv_aliqdesc').AsFloat;
    Itnv_aliqipi := tq.fieldbyname('Itnv_aliqipi').AsFloat;
    Itnv_datafat := tq.fieldbyname('Itnv_datafat').AsDateTime;
    Itnv_comisrep := tq.fieldbyname('Itnv_comisrep').AsFloat;
    Itnv_customedio := tq.fieldbyname('Itnv_customedio').AsFloat;
    Itnv_desc2 := tq.fieldbyname('Itnv_desc2').AsFloat;
    Itnv_desc3 := tq.fieldbyname('Itnv_desc3').AsFloat;
    Itnv_desc4 := tq.fieldbyname('Itnv_desc4').AsFloat;
    Itnv_desc5 := tq.fieldbyname('Itnv_desc5').AsFloat;
    Itnv_aliqicms := tq.fieldbyname('Itnv_aliqicms').AsFloat;
    Itnv_cst := tq.fieldbyname('Itnv_cst').AsString;
    Codf_Codigo := tq.fieldbyname('Codf_Codigo').AsString;
    Icms_Codigo := tq.fieldbyname('Icms_Codigo').AsString;
    Itnv_custo := tq.fieldbyname('Itnv_custo').asfloat;
    Itnv_Observacao := tq.fieldbyname('Itnv_Observacao').AsString;
    Itnv_ICMS := tq.FieldByName('Itnv_ICMS').AsFloat;
    Itnv_IPI := tq.FieldByName('Itnv_IPI').AsFloat;
    Itnv_EstoqueBaixado := tq.FieldByName('Itnv_EstoqueBaixado').AsString;
    Itnv_ValorFrete := tq.FieldByName('Itnv_ValorFrete').AsFloat;
    Itnv_DescontoItem := tq.FieldByName('Itnv_DescontoItem').AsFloat;
    Itnv_BcalcIcms := tq.FieldByName('Itnv_BcalcIcms').AsFloat;
    Itnv_BcalcIpi := tq.FieldByName('Itnv_BcalcIpi').AsFloat;
    Itnv_BcalcIcmsSubs := tq.FieldByName('Itnv_BcalcIcmsSubs').AsFloat;
    Itnv_IcmsSubs := tq.FieldByName('Itnv_IcmsSubs').AsFloat;
    Itnv_AliqIcmsSubs := tq.FieldByName('Itnv_AliqIcmsSubs').AsFloat;
    Itnv_MargemSubs := tq.FieldByName('Itnv_MargemSubs').AsFloat;
    Itnv_CST_IPI := tq.FieldByName('Itnv_CST_IPI').AsString;
    Itnv_COD_Enq := tq.FieldByName('Itnv_COD_Enq').AsString;
    Itnv_CST_PIS := tq.FieldByName('Itnv_CST_PIS').AsString;
    Itnv_BcalcPIS := tq.FieldByName('Itnv_BcalcPIS').AsFloat;
    Itnv_AliqPIS_P := tq.FieldByName('Itnv_AliqPIS_P').AsFloat;
    Itnv_QT_BcALCPIS := tq.FieldByName('Itnv_QT_BcALCPIS').AsFloat;
    Itnv_AliqPIS_R := tq.FieldByName('Itnv_AliqPIS_R').AsFloat;
    Itnv_PIS := tq.FieldByName('Itnv_PIS').AsFloat;
    Itnv_CST_COFINS := tq.FieldByName('Itnv_CST_COFINS').AsString;
    Itnv_BcalcCOFINS := tq.FieldByName('Itnv_BcalcCOFINS').AsFloat;
    Itnv_AliqCOFINS_P := tq.FieldByName('Itnv_AliqCOFINS_P').AsFloat;
    Itnv_QT_BcalcCOFINS := tq.FieldByname('Itnv_QT_BcalcCOFINS').AsFloat;
    Itnv_AliqCOFINS_R := tq.FieldByName('Itnv_AliqCOFINS_R').AsFloat;
    Itnv_COFINS := tq.FieldByName('Itnv_COFINS').AsFloat;
    Hist_Codigo := tq.FieldByName('Hist_Codigo').AsString;
    Itnv_BcICMSstRetUFremet := tq.FieldByName('Itnv_BcICMSstRetUFremet').AsFloat;
    Itnv_ICMSstUFremet := tq.FieldByname('Itnv_ICMSstUFremet').AsFloat;
    Itnv_BcICMSstUFdest := tq.FieldByName('Itnv_BcICMSstUFdest').AsFloat;
    Itnv_ICMSstUFdest := tq.FieldByname('Itnv_ICMSstUFdest').AsFloat;
    Itnv_BCstRet := tq.FieldByName('Itnv_BCstRet').AsFloat;
    Itnv_ICMSstRet := tq.FieldByname('Itnv_ICMSstRet').AsFloat;
    Itnv_vProd := tq.FieldByName('Itnv_vProd').AsFloat;
    Itnv_vFrete := tq.FieldByName('Itnv_vFrete').AsFloat;
    Itnv_vDesc := tq.FieldByName('Itnv_vDesc').AsFloat;
    Itnv_vOutras := tq.FieldByName('Itnv_vOutras').AsFloat;
    Itnv_pCredICMS := tq.FieldByName('Itnv_pCredICMS').AsFloat;
    Itnv_vSeguro := tq.FieldByName('Itnv_vSeguro').AsFloat;
    Itnv_AliqRedBC := tq.FieldByName('Itnv_AliqRedBC').AsFloat;
    Itnv_AliqBCop := tq.FieldByName('Itnv_AliqBCop').AsFloat;
    Itnv_CredICMSsn := tq.FieldByName('Itnv_CredICMSsn').AsFloat;
    Itnv_AliqRedBCst := tq.FieldByName('Itnv_AliqRedBCst').AsFloat;
    Itnv_AliqDif := tq.FieldByName('Itnv_AliqDif').AsFloat;
    Itnv_ICMSop := tq.FieldByName('Itnv_ICMSop').AsFloat;
    Itnv_ICMSDif := tq.FieldByName('Itnv_ICMSDif').AsFloat;
    Itnv_SomaST:= tq.FieldByName('Itnv_SomaST').AsString;
    Itnv_DescICMS:= tq.FieldByName('Itnv_DescICMS').AsFloat;
    Itnv_DescPIS:= tq.FieldByName('Itnv_DescPIS').AsFloat;
    Itnv_DescCOFINS:= tq.FieldByName('Itnv_DescCOFINS').AsFloat;
    Result := 1;
  end;
  tq.Close;
  tq.Free;
end;

function TItemNotaVenda.RecuperarNotaDev(p_nota_serie, p_Nota_numero, p_Ent_codigo: string; var p_cds: TClientDataSet): Byte;
var
  tq: TQuery;
  c: Integer;
  tpcampo: TFieldType;
  numReg: Integer;
begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := False;
  tq.SQL.Clear;
  tq.SQL.add('SELECT distinct nota_serie,nota_numero,ref_numero,ref_serie,ref_ent_codigo,itnv_datafat FROM ItemNotaVenda where ref_numero=:k_Nota_numero and ref_serie=:K_Nota_serie and ref_ent_codigo=:k_Ent_codigo');
  tq.ParamByName('K_Nota_numero').AsString := StrZero(p_Nota_numero, 9);
  tq.ParamByName('K_Nota_serie').AsString := p_nota_serie;
  tq.ParamByName('K_Ent_codigo').AsString := strzero(p_Ent_codigo, 5);
  tq.Open;
  if tq.eof then begin
    Ref_serie := '';
    Ref_numero := '';
    Ref_ent_codigo := '';
    Itnv_datafat := date;
    Result := 0;
  end else begin
    for c := 0 to tq.Fields.Count - 1 do begin
      tpcampo := tq.Fields[c].DataType;
      if (tpcampo <> ftString) then
        p_cds.FieldDefs.Add(tq.Fields[c].FieldName, tpcampo, 0, False)
      else
        p_cds.FieldDefs.Add(tq.Fields[c].FieldName, ftString, tq.Fields[c].Size, False);
    end;

    p_cds.Close;
    p_cds.CreateDataSet;
    p_cds.Open;

    numReg := tq.RecNo;
    tq.First;
    while not tq.Eof do begin
      p_cds.Append;
      for c := 0 to tq.Fields.Count - 1 do
        p_cds.FieldByName(tq.Fields[c].FieldName).Value := tq.FieldByName(tq.Fields[c].FieldName).Value;
      p_cds.Post;
      tq.Next;
    end;
    p_cds.First;
    tq.RecNo := numReg;
    Result := 1;
  end;
  tq.Close;
  tq.Free;
end;

procedure TItemNotaVenda.RecuperarPorNota2(P_q: TQuery; p_nota_serie,
  p_Nota_numero, p_Ent_codigo: string);
begin
  p_q.SQL.Clear;
  p_q.Params.Clear;
  p_q.SQL.add('Select * from itemnotavenda where nota_serie=:K_nota_serie ' +
    'and nota_numero=:K_nota_numero and ent_codigo=:K_ent_codigo');
  p_q.ParamByName('k_Nota_serie').AsString := p_nota_serie;
  p_q.ParamByName('k_Nota_numero').AsString := StrZero(p_Nota_numero, 9);
  p_q.ParamByName('k_Ent_codigo').AsString := strzero(p_Ent_codigo, 5);
end;

function TItemNotaVenda.Tira_SaldoFatura(P_nota_numero, p_nota_Serie,
  p_Ent_codigo, P_Itnv_item: string): double;
var
  tq: tquery;
  quant: double;
begin
  tq := TQuery.create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select * from ItemNotaVenda where Nota_serie=:K_Nota_serie and Nota_numero=:k_Nota_numero and  Ent_codigo=:k_Ent_codigo and itnv_item=:K_Itnv_item');
  tq.ParamByName('k_Nota_serie').AsString := p_nota_Serie;
  tq.ParamByName('k_Nota_numero').AsString := StrZero(P_nota_numero, 9);
  tq.ParamByName('k_Ent_codigo').AsString := strzero(p_Ent_codigo, 5);
  tq.ParamByName('k_Itnv_item').AsString := strzero(P_Itnv_item, 2);
  tq.Open;
  quant := 0;
  while not tq.eof do begin
    quant := quant + tq.fieldbyname('Itnv_quantidade').AsFloat;
  end;
  Result := quant;
end;

function TItemNotaVenda.Tira_SaldoFatura2(P_Ped_numero,
  P_Ped_Item: string): double;
var
  tq: tquery;
  quant: double;
begin
  tq := TQuery.create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  //tq.SQLConnection := dmInt1.CONN;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;

  {tq.SQL.add('Select * ' +
    'from MOVITEMPEDVENDA '+
    'where Ped_numero = ' + QuotedStr(StrZero(P_Ped_numero, 9)) + ' and Ped_item = ' + QuotedStr(StrZero(P_Ped_Item, 2)) + '');
  }

  tq.SQL.add('select ' +
    '     (case when i.Emp_Codigo in ' +
    '       (select cod_emp from controlepadrao) ' +
    '      then ' +
    '        Ped_Numero ' +
    '      else ' +
    '        case when (Ped_Numero2 =''000000000'' or Ped_Numero2 is null or Ped_Numero2 = '''') then Ped_Numero else Ped_Numero2 end ' +
    '      end ' +
    '      ) Ped_Numero, ' +
    '        ped_item, i.nota_serie, i.nota_numero, i.ent_codigo, i.itnv_item ' +
    'from MovItemPedVenda m, ItemNotaVenda i ' +
    'where m.Nota_numero||m.Nota_Serie||m.Ent_Codigo||m.Itnv_Item = i.Nota_numero||i.Nota_Serie||i.Ent_Codigo||i.Itnv_Item ' +
    '  and m.Ped_numero = ' + QuotedStr(StrZero(P_Ped_numero, 9)) + ' and m.Ped_item = ' + QuotedStr(StrZero(P_Ped_Item, 2)) + ' ' +
    'order by m.nota_serie, m.nota_numero, m.ent_codigo, lpad(m.Itnv_Item,3,''0'')');

  {tq.SQL.add('Select * ' +

    'from (select ( ' +
    '       case when Nota_numero || Nota_Serie in ( ' +
    '         select Nota_numero || Nota_Serie ' +
    '         from Notavenda ' +
    '         where emp_codigo in ( ' +
    '           select cod_emp ' +
    '           from controlepadrao ' +
    '         ) ' +
    '       ) ' +

    '       then ' +
    '         Ped_Numero ' +
    '       else ' +
    '         case when (Ped_Numero2 =''000000000'' or Ped_Numero2 is null) then Ped_Numero else Ped_Numero2 end ' +
    '       end ' +

    '     ) Ped_Numero, ped_item, nota_serie, nota_numero, ent_codigo, itnv_item ' +

    '     from movitempedvenda) ' +

    'where Ped_numero = :k_Ped_numero and ' +
    '      Ped_item = :k_ped_item');
  tq.ParamByName('k_Ped_numero').AsString := StrZero(P_Ped_numero, 9);
  tq.ParamByName('k_Ped_item').AsString := StrZero(P_Ped_Item, 2);}

  tq.Open;

  quant := 0;

  while not tq.eof do begin
    Recuperar(tq.fieldbyname('Nota_serie').AsString, tq.fieldbyname('Nota_numero').AsString, tq.fieldbyname('ent_codigo').AsString, tq.fieldbyname('itnv_item').AsString);
    quant := quant + Itnv_quantidade;
    tq.next;
  end;

  result := quant;

  tq.Close;
  tq.Free;

end;

procedure TItemNotaVenda.Recuperar_Nota;
var
  tq: TQuery;
  i: integer;
  produto: TProduto;
  item_assistencia: TItem_Assistencia;
  fase_assistencia: TFase_Assistencia;
  MovItemPedVenda: TMovItemPedVenda;
begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.db.DatabaseName;
  tq.Active := False;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select * from ItemNotaVenda where Nota_Serie=:a and Nota_Numero=:b and ' +
    'Ent_Codigo=:c order by Nota_Serie,Nota_Numero,Ent_Codigo, lpad(Itnv_Item,3,''0'')');
  tq.Params[0].AsString := p_serie;
  tq.Params[1].AsString := p_nota;
  tq.Params[2].AsString := p_entidade;
  tq.Open;

  sg.rowcount := 2;
  sg.Cells[0, 1] := ''; // Item da Nota
  sg.Cells[1, 1] := ''; // Produto
  sg.Cells[2, 1] := ''; // Quantidade
  sg.Cells[3, 1] := ''; // Visto
  i := 1;
  produto := TProduto.Create;
  item_assistencia := TItem_Assistencia.Create;
  fase_assistencia := TFase_Assistencia.Create;
  MovItemPedVenda := TMovItemPedVenda.Create;

  while not tq.eof do begin
    if i > 1 then
      sg.rowcount := sg.rowcount + 1;
    sg.Cells[0, i] := tq.fieldbyname('Itnv_Item').AsString;
    //produto.Recuperar(tq.fieldbyname('Pro_Codigo').AsString);
    //sg.Cells[1,i]:= tq.fieldbyname('Pro_Codigo').AsString+'-'+produto.Pro_nome;
    MovItemPedVenda.RecuperarNota(tq.fieldbyname('nota_serie').AsString, tq.fieldbyname('nota_numero').AsString, tq.fieldbyname('Ent_codigo').AsString, tq.fieldbyname('Itnv_item').AsString);
    sg.Cells[1, i] := tq.fieldbyname('Pro_Codigo').AsString + '-' + Produto.Rec_DescVariacao(true, tq.fieldbyname('Pro_codigo').AsString, MovItemPedVenda.V_Ped_Numero, MovItemPedVenda.V_Ped_item);
    if item_assistencia.Existe_Item(p_serie, p_nota, p_entidade, tq.fieldbyname('Itnv_Item').AsString) then begin
      sg.cells[3, i] := '  V';
    end else begin
      sg.cells[3, i] := '';
    end; //fim if

    if fase_assistencia.Existe_Item(p_serie, p_nota, p_entidade, tq.fieldbyname('Itnv_Item').AsString) then begin
      sg.Cells[2, i] := Formata_Qtde2(tq.fieldbyname('Itnv_Quantidade').asfloat - fase_assistencia.Soma_Qtde(p_serie, p_nota, p_entidade, tq.fieldbyname('Itnv_Item').AsString));
    end else begin
      sg.Cells[2, i] := Formata_Qtde2(tq.fieldbyname('Itnv_Quantidade').asfloat - item_assistencia.Soma_Qtde(p_serie, p_nota, p_entidade, tq.fieldbyname('Itnv_Item').AsString));
    end; //fim if

    if (sg.cells[3, i] = '') and (trim(sg.cells[2, i]) = '0.00000') then begin
      if i > 1 then
        sg.rowcount := sg.rowcount - 1;
      i := i - 1;
    end; //fim if

    i := i + 1;
    tq.next;
  end; //fim while tq

  MovItemPedVenda.free;
  fase_assistencia.free;
  item_assistencia.free;
  produto.free;
  tq.close;
  tq.free;
end;

function TItemNotaVenda.DevolucaoReferencia(P_nota_serie, P_Nota1, P_nota2,
  P_Ent_codigo, P_itnv_item, P_ref_nota_serie, P_ref_Nota_numero,
  P_ref_Ent_codigo, P_ref_itnv_item: string): Byte;
var
  tq: TQuery;
begin
  tq := TQuery.create(DmInt.db);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('update itemnotavenda set Ref_serie=:a, ' +
    'Ref_numero=:b , Ref_ent_codigo=:c, ref_itnv_item=:d where ' +
    'Nota_serie=:e and (nota_numero=:f or nota_numero=:g) and ent_codigo=:h and Itnv_item=:i');
  tq.Params[0].AsString := P_ref_nota_serie;
  tq.Params[1].AsString := StrZero(P_ref_Nota_numero, 9);
  tq.Params[2].AsString := strzero(P_ref_Ent_codigo, 5);
  tq.Params[3].AsString := strzero(P_ref_itnv_item, 2);
  tq.Params[4].AsString := P_nota_serie;
  tq.Params[5].AsString := StrZero(P_Nota1, 9);
  tq.Params[6].AsString := StrZero(P_nota2, 9);
  tq.Params[7].AsString := strzero(P_Ent_codigo, 5);
  tq.Params[8].AsString := strzero(P_itnv_item, 2);
  result := 1;
  GeraLog('ITEMNOTAVENDA', 'DevolucaoReferencia');
  tq.ExecSQL;
  tq.free;
end;

function TItemNotaVenda.EstornaDevolucao(ref_nota_serie, ref_Nota_numero,
  ref_nota_numero2, ref_Ent_codigo: string): Byte;
var
  tq: TQuery;
begin
  tq := TQuery.create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select * from ItemNotaVenda where nota_Numero=:a and nota_serie=:b ' +
    'and Ent_codigo=:c');
  tq.Params[0].AsString := strzero(ref_Nota_numero, 9);
  tq.Params[1].AsString := ref_nota_serie;
  tq.Params[2].AsString := strzero(Ref_ent_codigo, 5);
  tq.Open;

  num_nota := tq.fieldbyname('ref_Numero').AsString;
  num_serie := tq.fieldbyname('ref_Serie').AsString;
  tq.Close;

  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Update ItemNotaVenda set ' +
    'ref_Serie=null, ref_numero=null, ref_ent_codigo=null, ref_itnv_item=null ' +
    'where ref_Serie=:e and (ref_numero=:f or ref_numero=:g) and ref_ent_codigo=:h');
  tq.Params[0].AsString := ref_nota_serie;
  tq.Params[1].AsString := StrZero(ref_Nota_numero, 9);
  tq.Params[2].AsString := StrZero(ref_nota_numero2, 9);
  tq.Params[3].AsString := StrZero(Ref_ent_codigo, 5);
  GeraLog('ITEMNOTAVENDA', 'EstornaDevolucao');
  tq.ExecSQL;

  tq.Close;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('DELETE FROM ItemNotaVenda where (Nota_numero=:K_Nota_Numero or Nota_numero=:K_nota_numero2) and Nota_serie=:K_Nota_serie and Ent_codigo=:k_Ent_codigo');
  tq.ParamByName('k_Nota_numero').AsString := StrZero(ref_Nota_numero, 9);
  tq.ParamByName('k_Nota_numero2').AsString := StrZero(ref_nota_numero2, 9);
  tq.ParamByName('k_Nota_serie').AsString := ref_nota_serie;
  tq.ParamByName('k_Ent_codigo').AsString := strzero(Ref_ent_codigo, 5);
  GeraLog('ITEMNOTAVENDA', 'EstornaDevolucao');
  tq.execSQL;
  result := 1;
  tq.Free;
end;

procedure TItemNotaVenda.RecuperarPorNota(P_q: TQuery; p_nota_serie,
  p_Nota_numero, p_Ent_codigo: string);
begin
  p_q.SQL.Clear;
  p_q.Params.Clear;
  p_q.SQL.add('Select * from ItemNotaVenda where Nota_serie=:K_Nota_serie and Nota_numero=:k_Nota_numero and  Ent_codigo=:k_Ent_codigo order by lpad(Itnv_Item,3,''0'')');
  p_q.ParamByName('k_Nota_serie').AsString := p_nota_serie;
  p_q.ParamByName('k_Nota_numero').AsString := StrZero(p_Nota_numero, 9);
  p_q.ParamByName('k_Ent_codigo').AsString := strzero(p_Ent_codigo, 5);
end;

function TItemNotaVenda.Nota_Devolvida;
var
  tq: TQuery;

begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := False;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select * from ItemNotaVenda where Ref_numero in (:a,:b) and ' +
    'Ref_serie=:c and Ref_Ent_codigo=:d');
  tq.Params[0].AsString := nota1;
  tq.Params[1].AsString := nota2;
  tq.Params[2].AsString := serie;
  tq.Params[3].AsString := strzero(Entidade, 5);
  tq.Open;

  if not tq.eof then begin
    result := true;
    Notv_serie := tq.FieldByName('Nota_Serie').AsString;
    Notv_Numero := tq.FieldByName('Nota_Numero').AsString;

  end else begin
    result := false;

  end;

  tq.close;
  tq.Free;

end;

function TItemNotaVenda.Nota_Devolvida1(Entidade, nota1, nota2, serie, sequencia: string; dataIni, dataFin: TDateTime): double;
var
  tq: TQuery;

begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := False;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select i.itnv_quantidade, i.Nota_Serie, i.Nota_Numero ' +

    'from ItemNotaVenda i, notavenda n ' +

    'where (n.nota_numero = i.nota_numero and ' +
    '       n.nota_serie = i.nota_serie and ' +
    '       n.ent_codigo = i.ent_codigo) and ' +
    '      (n.notv_datafat >= :f and ' +
    '       n.notv_datafat <= :g) and ' +
    '      i.Ref_numero in (:a, :b) and ' +
    '      i.Ref_serie = :c and ' +
    '      i.Ref_Ent_codigo = :d and ' +
    '      i.ref_itnv_item = :e ');

  tq.Params[0].AsDateTime := dataIni;
  tq.Params[1].AsDateTime := dataFin;
  tq.Params[2].AsString := nota1;
  tq.Params[3].AsString := nota2;
  tq.Params[4].AsString := serie;
  tq.Params[5].AsString := strzero(Entidade, 5);
  tq.Params[6].AsString := sequencia;
  tq.Open;

  if not tq.eof then begin
    result := tq.FieldByName('itnv_quantidade').AsFloat;
    Notv_serie := tq.FieldByName('Nota_Serie').AsString;
    Notv_Numero := tq.FieldByName('Nota_Numero').AsString;

  end else begin
    result := 0;
    Notv_serie := '';
    Notv_Numero := '';

  end;

  tq.close;
  tq.Free;

end;

procedure TItemNotaVenda.Coloca_SaldoProduto;
var
  tq: TQuery;
  produto: TProduto;
  fichaproduto: TFichaProduto;
  backup: TBackupVenda;
  bkp, n1, n2: string;
  parametros: TParametros;
begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;

  tq.Active := False;
  tq.SQL.Clear;
  tq.SQL.add('Select * ' +

    'from ItemNotaVenda ' +

    'where Nota_numero = :k_Nota_numero and ' +
    '      Nota_serie = :K_Nota_serie and ' +
    '      Ent_codigo = :k_Ent_codigo ' +

    'order by lpad(Itnv_Item,3,''0'') ');

  tq.Params[0].AsString := Num_Nota;
  tq.Params[1].AsString := Num_Serie;
  tq.Params[2].AsString := strzero(p_Ent_codigo, 5);
  tq.Open;

  produto := TProduto.Create;
  fichaproduto := TFichaProduto.Create;
  backup := TBackupVenda.Create;
  parametros := TParametros.Create;
  parametros.Recuperar('1');

  while not tq.eof do begin
    produto.Recuperar(tq.fieldbyname('Pro_codigo').AsString);
    if produto.Pro_baixaaut = 0 then begin
      if tipo = 1 then begin // Dev. Nota de Venda
        // movimenta a ficha do produto
        fichaproduto.Pro_Codigo := tq.fieldbyname('Pro_codigo').AsString;
        fichaproduto.Nota_Serie := Num_Serie;
        fichaproduto.Nota_Numero := Num_Nota;
        fichaproduto.Ent_Codigo := strzero(p_Ent_codigo, 5);
        fichaproduto.Itnv_Item := tq.fieldbyname('Itnv_item').AsString;
        fichaproduto.Fp_Data := Data_Fat;
        fichaproduto.Fp_Quantidade := tq.fieldbyname('Itnv_quantidade').asfloat;
        fichaproduto.Emp_Codigo := tq.FieldByName('Emp_Codigo').AsString;
        backup.RecuperarBackup(num_serie, num_nota, bkp);
        backup.RecuperarNota(num_serie, bkp, p_Ent_codigo, n1, n2);

        if n1 = num_nota then begin
          bkp := n2
        end else begin
          bkp := n1;
        end;

        Recuperar(num_serie, bkp, strzero(p_Ent_codigo, 5), tq.fieldbyname('Itnv_item').AsString);
        fichaproduto.FP_VlUnit := tq.fieldbyname('itnv_valorunit').asfloat + Itnv_valorUnit;
        fichaproduto.Gravar(fichaproduto.Retorna_Ultima);

      end; //fim if tipo=1

      produto.Adiciona_Saldo(tq.fieldbyname('Pro_codigo').AsString, tq.fieldbyname('Itnv_quantidade').asfloat, Data_Fat);

    end; //fim if produto

    tq.next;

  end; //fim while tq

  if parametros.Baixa_EstoqueVolumes = 'S' then begin
    tq.Active := False;
    tq.SQL.Clear;
    tq.SQL.add('Select i.*, vol_codigo ' +

      'from ItemNotaVenda i, volumes v ' +

      'where i.pro_codigo = v.pro_codigo and ' +
      '      Nota_numero = :k_Nota_numero and ' +
      '      Nota_serie = :K_Nota_serie and ' +
      '      Ent_codigo = :k_Ent_codigo ' +

      'order by lpad(Itnv_Item,3,''0'') ');

    tq.Params[0].AsString := Num_Nota;
    tq.Params[1].AsString := Num_Serie;
    tq.Params[2].AsString := strzero(p_Ent_codigo, 5);
    tq.Open;

    while not tq.eof do begin
      produto.Recuperar(tq.fieldbyname('Vol_codigo').AsString);
      if produto.Pro_baixaaut = 0 then begin
        if tipo = 1 then begin // Dev. Nota de Venda
          // movimenta a ficha do produto
          fichaproduto.Pro_Codigo := tq.fieldbyname('Vol_codigo').AsString;
          fichaproduto.Nota_Serie := Num_Serie;
          fichaproduto.Nota_Numero := Num_Nota;
          fichaproduto.Ent_Codigo := strzero(p_Ent_codigo, 5);
          fichaproduto.Itnv_Item := tq.fieldbyname('Itnv_item').AsString;
          fichaproduto.Fp_Data := Data_Fat;
          fichaproduto.Fp_Quantidade := tq.fieldbyname('Itnv_quantidade').asfloat;
          fichaproduto.Emp_Codigo := tq.FieldByName('Emp_Codigo').AsString;
          backup.RecuperarBackup(num_serie, num_nota, bkp);
          backup.RecuperarNota(num_serie, bkp, p_Ent_codigo, n1, n2);

          if n1 = num_nota then begin
            bkp := n2
          end else begin
            bkp := n1;
          end;

          Recuperar(num_serie, bkp, strzero(p_Ent_codigo, 5), tq.fieldbyname('Itnv_item').AsString);
          fichaproduto.FP_VlUnit := tq.fieldbyname('itnv_valorunit').asfloat + Itnv_valorUnit;
          fichaproduto.Gravar(fichaproduto.Retorna_Ultima);

        end; //fim if tipo=1

        produto.Adiciona_Saldo(tq.fieldbyname('Vol_codigo').AsString, tq.fieldbyname('Itnv_quantidade').asfloat, Data_Fat);

      end; //fim if produto

      tq.next;

    end; //fim while tq
  end;

  backup.free;
  fichaproduto.free;
  produto.free;
  parametros.Free;
  tq.Close;
  tq.Free;

end;

procedure TItemNotaVenda.Tira_SaldoProduto;
var
  tq: TQuery;
  produto: TProduto;
  fichaproduto: TFichaProduto;
  backup: TBackupVenda;
  bkp, n1, n2: string;
  Prod_Entidade: TProdutoEntidade;
  baixarEstoque: Boolean;
  parametros: TParametros;
  strCodigoProduto: string;
begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := False;
  tq.SQL.Clear;

  Parametros := TParametros.Create;
  Parametros.Recuperar('1');

  tq.SQL.add('Select * ' +

    'from ItemNotaVenda ' +

    'where Nota_numero = :k_Nota_numero and ' +
    '      Nota_serie = :K_Nota_serie and ' +
    '      Ent_codigo = :k_Ent_codigo ' +

    'order by lpad(Itnv_Item,3,''0'')');

  tq.Params[0].AsString := Num_Nota;
  tq.Params[1].AsString := Num_Serie;
  tq.Params[2].AsString := strzero(p_Ent_codigo, 5);

  tq.Open;

  produto := TProduto.Create;
  fichaproduto := TFichaProduto.Create;
  backup := TBackupVenda.Create;
  Prod_Entidade := TProdutoEntidade.create;

  while not tq.eof do begin
    strCodigoProduto := tq.fieldbyname('Pro_codigo').AsString;
    baixarEstoque := tq.FieldByName('Itnv_EstoqueBaixado').AsString <> 'N';
    produto.Recuperar(strCodigoProduto);
    if produto.Pro_baixaaut = 0 then begin
      if tipo = 0 then begin // Nota de Venda
        // movimenta a ficha do produto
        fichaproduto.Pro_Codigo := strCodigoProduto;
        fichaproduto.Nota_Serie := Num_Serie;
        fichaproduto.Nota_Numero := Num_Nota;
        fichaproduto.Ent_Codigo := strzero(p_Ent_codigo, 5);
        fichaproduto.Itnv_Item := tq.fieldbyname('Itnv_item').AsString;
        fichaproduto.Fp_Quantidade := -tq.fieldbyname('Itnv_quantidade').asfloat;
        fichaproduto.Fp_Data := Data_Fat;
        fichaproduto.Emp_Codigo := tq.FieldByName('Emp_Codigo').AsString;
        backup.RecuperarBackup(num_serie, num_nota, bkp);
        backup.RecuperarNota(num_serie, bkp, p_Ent_codigo, n1, n2);
        if n1 = num_nota then
          bkp := n2
        else
          bkp := n1;
        Recuperar(num_serie, bkp, strzero(p_Ent_codigo, 5), tq.fieldbyname('Itnv_item').AsString);
        fichaproduto.FP_VlUnit := tq.fieldbyname('itnv_valorunit').asfloat + Itnv_valorUnit;
        if baixarEstoque then begin
          fichaproduto.Gravar(fichaproduto.Retorna_Ultima);
        end;
        // fim
      end; //fim if tipo=0
      if baixarEstoque then begin
        Prod_Entidade.Tira_Saldo(strzero(p_Ent_codigo, 5), strCodigoProduto, tq.fieldbyname('Itnv_quantidade').asfloat);
        produto.Tira_Saldo(strCodigoProduto, tq.fieldbyname('Itnv_quantidade').asfloat, Data_Fat);
      end;
    end; //fim if produto
    tq.next;
  end; //fim while tq

  if parametros.Baixa_EstoqueVolumes = 'S' then begin
    tq.Active := False;
    tq.SQL.Clear;
    tq.Params.Clear;
    tq.SQL.add('Select i.*, vol_codigo ' +

      'from ItemNotaVenda i, volumes v ' +

      'where i.pro_codigo = v.pro_codigo and ' +
      '      Nota_numero = :k_Nota_numero and ' +
      '      Nota_serie = :K_Nota_serie and ' +
      '      Ent_codigo = :k_Ent_codigo ' +

      'order by lpad(Itnv_Item,3,''0'')');
    tq.Params[0].AsString := Num_Nota;
    tq.Params[1].AsString := Num_Serie;
    tq.Params[2].AsString := strzero(p_Ent_codigo, 5);

    tq.Open;

    while not tq.eof do begin
      strCodigoProduto := tq.fieldbyname('Vol_codigo').AsString;
      baixarEstoque := tq.FieldByName('Itnv_EstoqueBaixado').AsString <> 'N';
      produto.Recuperar(strCodigoProduto);
      if produto.Pro_baixaaut = 0 then begin
        if tipo = 0 then begin // Nota de Venda
          // movimenta a ficha do produto
          fichaproduto.Pro_Codigo := strCodigoProduto;
          fichaproduto.Nota_Serie := Num_Serie;
          fichaproduto.Nota_Numero := Num_Nota;
          fichaproduto.Ent_Codigo := strzero(p_Ent_codigo, 5);
          fichaproduto.Itnv_Item := tq.fieldbyname('Itnv_item').AsString;
          fichaproduto.Fp_Quantidade := -tq.fieldbyname('Itnv_quantidade').asfloat;
          fichaproduto.Fp_Data := Data_Fat;
          fichaproduto.Emp_Codigo := tq.FieldByName('Emp_Codigo').AsString;
          backup.RecuperarBackup(num_serie, num_nota, bkp);
          backup.RecuperarNota(num_serie, bkp, p_Ent_codigo, n1, n2);
          if n1 = num_nota then
            bkp := n2
          else
            bkp := n1;
          Recuperar(num_serie, bkp, strzero(p_Ent_codigo, 5), tq.fieldbyname('Itnv_item').AsString);
          fichaproduto.FP_VlUnit := tq.fieldbyname('itnv_valorunit').asfloat + Itnv_valorUnit;
          if baixarEstoque then begin
            fichaproduto.Gravar(fichaproduto.Retorna_Ultima);
          end;
          // fim
        end; //fim if tipo=0
        if baixarEstoque then begin
          Prod_Entidade.Tira_Saldo(strzero(p_Ent_codigo, 5), strCodigoProduto, tq.fieldbyname('Itnv_quantidade').asfloat);
          produto.Tira_Saldo(strCodigoProduto, tq.fieldbyname('Itnv_quantidade').asfloat, Data_Fat);
        end;
      end; //fim if produto
      tq.next;
    end; //fim while tq

  end;

  backup.free;
  fichaproduto.free;
  produto.free;
  Prod_Entidade.Free;
  parametros.Free;
  tq.Close;
  tq.Free;
end;

function TItemNotaVenda.Nota_Devolucao;
var
  tq: TQuery;
begin
  try
    tq := Tquery.Create(DmInt);
    tq.DatabaseName := DmInt.Db.DatabaseName;
    tq.Active := False;
    tq.SQL.Clear;
    tq.Params.Clear;
    tq.SQL.add('Select * from ItemNotaVenda where Nota_Numero in (:a,:b) and ' +
      'Nota_Serie=:c and Ent_codigo=:d and Ref_Numero is not null');
    tq.Params[0].AsString := nota1;
    tq.Params[1].AsString := nota2;
    tq.Params[2].AsString := serie;
    tq.Params[3].AsString := strzero(Entidade, 5);
    tq.Open;
    if not tq.eof then begin
      result := true;
      Ref_numero := tq.FieldByName('Ref_Numero').AsString;
      Ref_serie := tq.FieldByName('Ref_Serie').AsString;
    end else
      result := false;
  finally
    FreeAndNil(tq);
  end;
end;

function TItemNotaVenda.Recuperar1;
var
  tq: TQuery;
begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := False;
  tq.SQL.Clear;
  tq.SQL.add('SELECT * FROM ItemNotaVenda where (ref_numero=:a or ref_numero=:b) and ref_serie=:c and ref_Ent_codigo=:d ' +
    'and ref_Itnv_item=:e');
  tq.Params[0].AsString := StrZero(p_Nota_numero1, 9);
  tq.Params[1].AsString := StrZero(p_Nota_numero2, 9);
  tq.Params[2].AsString := p_nota_serie;
  tq.Params[3].AsString := strzero(p_Ent_codigo, 5);
  tq.Params[4].AsString := StrZero(p_Itnv_item, 2);
  tq.Open;
  if tq.eof then
    result := 0
  else
    result := 1;
  Ref_serie := tq.fieldbyname('Ref_serie').AsString;
  Ref_numero := tq.fieldbyname('Ref_numero').AsString;
  Ref_ent_codigo := tq.fieldbyname('Ref_ent_codigo').AsString;
  Ref_Itnv_item := tq.fieldbyname('Ref_Itnv_item').AsString;
  Pro_codigo := tq.fieldbyname('Pro_codigo').AsString;
  Emp_codigo := tq.fieldbyname('Emp_codigo').AsString;
  Itnv_quantidade := tq.fieldbyname('Itnv_quantidade').AsFloat;
  Itnv_valorUnit := tq.fieldbyname('Itnv_valorUnit').AsFloat;
  Itnv_aliqdesc := tq.fieldbyname('Itnv_aliqdesc').AsFloat;
  Itnv_aliqipi := tq.fieldbyname('Itnv_aliqipi').AsFloat;
  Itnv_datafat := tq.fieldbyname('Itnv_datafat').AsDateTime;
  Itnv_comisrep := tq.fieldbyname('Itnv_comisrep').AsFloat;
  Itnv_customedio := tq.fieldbyname('Itnv_customedio').AsFloat;
  Itnv_desc2 := tq.fieldbyname('Itnv_desc2').AsFloat;
  Itnv_desc3 := tq.fieldbyname('Itnv_desc3').AsFloat;
  Itnv_desc4 := tq.fieldbyname('Itnv_desc4').AsFloat;
  Itnv_desc5 := tq.fieldbyname('Itnv_desc5').AsFloat;
  Itnv_aliqicms := tq.fieldbyname('Itnv_aliqicms').AsFloat;
  Itnv_cst := tq.fieldbyname('Itnv_cst').AsString;
  Codf_Codigo := tq.fieldbyname('Codf_Codigo').AsString;
  Icms_Codigo := tq.fieldbyname('Icms_Codigo').AsString;
  Itnv_custo := tq.fieldbyname('Itnv_custo').asfloat;
  Itnv_Observacao := tq.fieldbyname('Itnv_Observacao').AsString;
  Itnv_ICMS := tq.fieldbyname('Itnv_ICMS').AsFloat;
  Itnv_IPI := tq.FieldByName('Itnv_IPI').AsFloat;
  Itnv_EstoqueBaixado := tq.FieldByName('Itnv_EstoqueBaixado').AsString;
  Itnv_ValorFrete := tq.FieldByName('Itnv_ValorFrete').AsFloat;
  Itnv_DescontoItem := tq.FieldByName('Itnv_DescontoItem').AsFloat;
  Itnv_BcalcIcms := tq.FieldByName('Itnv_BcalcIcms').AsFloat;
  Itnv_BcalcIpi := tq.FieldByName('Itnv_BcalcIpi').AsFloat;
  Itnv_BcalcIcmsSubs := tq.FieldByName('Itnv_BcalcIcmsSubs').AsFloat;
  Itnv_IcmsSubs := tq.FieldByName('Itnv_IcmsSubs').AsFloat;
  Itnv_AliqIcmsSubs := tq.FieldByName('Itnv_AliqIcmsSubs').AsFloat;
  Itnv_MargemSubs := tq.FieldByName('Itnv_MargemSubs').AsFloat;
  Itnv_CST_IPI := tq.FieldByName('Itnv_CST_IPI').AsString;
  Itnv_COD_Enq := tq.FieldByName('Itnv_COD_Enq').AsString;
  Itnv_CST_PIS := tq.FieldByName('Itnv_CST_PIS').AsString;
  Itnv_BcalcPIS := tq.FieldByName('Itnv_BcalcPIS').AsFloat;
  Itnv_AliqPIS_P := tq.FieldByName('Itnv_AliqPIS_P').AsFloat;
  Itnv_QT_BcALCPIS := tq.FieldByName('Itnv_QT_BcALCPIS').AsFloat;
  Itnv_AliqPIS_R := tq.FieldByName('Itnv_AliqPIS_R').AsFloat;
  Itnv_PIS := tq.FieldByName('Itnv_PIS').AsFloat;
  Itnv_CST_COFINS := tq.FieldByName('Itnv_CST_COFINS').AsString;
  Itnv_BcalcCOFINS := tq.FieldByName('Itnv_BcalcCOFINS').AsFloat;
  Itnv_AliqCOFINS_P := tq.FieldByName('Itnv_AliqCOFINS_P').AsFloat;
  Itnv_QT_BcalcCOFINS := tq.FieldByName('Itnv_QT_BcalcCOFINS').AsFloat;
  Itnv_AliqCOFINS_R := tq.FieldByName('Itnv_AliqCOFINS_R').AsFloat;
  Itnv_COFINS := tq.FieldByName('Itnv_COFINS').AsFloat;
  Hist_Codigo := tq.FieldByName('Hist_Codigo').AsString;
  Itnv_BcICMSstRetUFremet := tq.FieldByName('Itnv_BcICMSstRetUFremet').AsFloat;
  Itnv_ICMSstUFremet := tq.FieldByname('Itnv_ICMSstUFremet').AsFloat;
  Itnv_BcICMSstUFdest := tq.FieldByname('Itnv_BcICMSstUFdest').AsFloat;
  Itnv_ICMSstUFdest := tq.FieldByName('Itnv_ICMSstUFdest').AsFloat;
  Itnv_BCstRet := tq.FieldByName('Itnv_BCstRet').AsFloat;
  Itnv_ICMSstRet := tq.FieldByName('Itnv_ICMSstRet').AsFloat;
  Itnv_vProd := tq.FieldByName('Itnv_vProd').AsFloat;
  Itnv_vFrete := tq.FieldByName('Itnv_vFrete').AsFloat;
  Itnv_vDesc := tq.FieldByName('Itnv_vDesc').AsFloat;
  Itnv_vOutras := tq.FieldByName('Itnv_vOutras').AsFloat;
  Itnv_pCredICMS := tq.FieldByName('Itnv_pCredICMS').AsFloat;
  Itnv_vSeguro := tq.FieldByName('Itnv_vSeguro').AsFloat;
  Itnv_AliqRedBC := tq.FieldByName('Itnv_AliqRedBC').AsFloat;
  Itnv_AliqBCop := tq.FieldByName('Itnv_AliqBCop').AsFloat;
  Itnv_CredICMSsn := tq.FieldByName('Itnv_CredICMSsn').AsFloat;
  Itnv_AliqRedBCst := tq.FieldByName('Itnv_AliqRedBCst').AsFloat;
  Itnv_AliqDif := tq.FieldByName('Itnv_AliqDif').AsFloat;
  Itnv_ICMSop := tq.FieldByName('Itnv_ICMSop').AsFloat;
  Itnv_ICMSDif := tq.FieldByName('Itnv_ICMSDif').AsFloat;
  Itnv_SomaST:= tq.FieldByName('Itnv_SomaST').AsString;
  Itnv_DescICMS:= tq.FieldByName('Itnv_DescICMS').AsFloat;
  Itnv_DescPIS:= tq.FieldByName('Itnv_DescPIS').AsFloat;
  Itnv_DescCOFINS:= tq.FieldByName('Itnv_DescCOFINS').AsFloat;
  tq.Close;
  tq.Free;
end;

function TItemNotaVenda.Itens_IcmsDiferente;
var
  tq: TQuery;
  ok: boolean;
  xaliq: double;
begin
  tq := TQuery.Create(DmInt);
  tq.DatabaseName := DmInt.db.DatabaseName;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select * from ItemNotaVenda where Nota_Serie=:a and Nota_Numero=:b and ' +
    'Ent_Codigo=:c');
  tq.Params[0].AsString := p_Nota_Serie;
  tq.Params[1].AsString := p_Nota_Numero;
  tq.Params[2].AsString := p_ent_codigo;
  tq.Open;
  ok := false;
  xaliq := tq.fieldbyname('Itnv_aliqicms').AsFloat;
  while not tq.eof do begin
    if xaliq <> tq.fieldbyname('Itnv_aliqicms').AsFloat then
      ok := true;
    tq.next;
  end;
  tq.close;
  tq.free;
  xaliq_icms := xaliq;
  result := ok;
end;

function TItemNotaVenda.Nota_SemItem;
var
  tq: TQuery;
begin
  tq := TQuery.Create(DmInt);
  tq.DatabaseName := DmInt.db.DatabaseName;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select * from ItemNotaVenda where Nota_Serie=:a and Nota_Numero=:b and ' +
    'Ent_Codigo=:c');
  tq.Params[0].AsString := p_Nota_Serie;
  tq.Params[1].AsString := p_Nota_Numero;
  tq.Params[2].AsString := p_ent_codigo;
  tq.Open;
  result := tq.eof;
  tq.close;
  tq.free;
end;

function TItemNotaVenda.Itens_CFOPDiferente;
var
  tq: TQuery;
  ok: boolean;
  xcfop: string;
begin
  tq := TQuery.Create(DmInt);
  tq.DatabaseName := DmInt.db.DatabaseName;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select * from ItemNotaVenda where Nota_Serie=:a and Nota_Numero=:b and ' +
    'Ent_Codigo=:c');
  tq.Params[0].AsString := p_Nota_Serie;
  tq.Params[1].AsString := p_Nota_Numero;
  tq.Params[2].AsString := p_ent_codigo;
  tq.Open;
  ok := false;
  xcfop := tq.fieldbyname('Codf_Codigo').AsString;
  while not tq.eof do begin
    if xcfop <> tq.fieldbyname('Codf_Codigo').AsString then
      ok := true;
    tq.next;
  end;
  tq.close;
  tq.free;
  result := ok;
end;

function TItemNotaVenda.Gravar1(p_nota_serie, p_Nota_numero, p_Ent_codigo,
  p_Itnv_item: string): Byte;
begin
  with DmInt1.stPr_ItemV do begin
    Active := False;
    ParamByName('NOTA_SERIE').Value := p_nota_serie;
    ParamByName('Nota_numero').Value := StrZero(p_Nota_numero, 9);
    ParamByName('Ent_codigo').Value := StrZero(p_Ent_codigo, 5);
    ParamByName('Itnv_item').Value := StrZero(p_Itnv_item, 2);
    if Ref_numero <> '' then begin
      ParamByName('Ref_serie').Value := Ref_serie;
      ParamByName('Ref_numero').Value := StrZero(Ref_numero, 9);
      ParamByName('Ref_ent_codigo').Value := StrZero(Ref_ent_codigo, 5);
      ParamByName('Ref_Itnv_item').Value := StrZero(Ref_Itnv_item, 2);
    end;
    ParamByName('Pro_codigo').Value := Pro_codigo;
    ParamByName('Emp_codigo').Value := Emp_codigo;
    ParamByName('Itnv_quantidade').Value := Itnv_quantidade;
    ParamByName('Itnv_valorUnit').Value := Itnv_valorUnit;
    ParamByName('Itnv_aliqdesc').Value := Itnv_aliqdesc;
    ParamByName('Itnv_aliqipi').Value := Itnv_aliqipi;
    ParamByName('Itnv_datafat').Value := Itnv_datafat;
    ParamByName('Itnv_comisrep').Value := Itnv_comisrep;
    ParamByName('Itnv_customedio').Value := Itnv_customedio;
    ParamByName('Itnv_desc2').Value := Itnv_desc2;
    ParamByName('Itnv_desc3').Value := Itnv_desc3;
    ParamByName('Itnv_desc4').Value := Itnv_desc4;
    ParamByName('Itnv_desc5').Value := Itnv_desc5;
    ParamByName('Itnv_aliqicms').Value := Itnv_aliqicms;
    ParamByName('Itnv_cst').Value := Itnv_cst;
    if Trim(Codf_Codigo) <> '' then
      ParamByName('Codf_Codigo').Value := trim(Codf_Codigo);
    if Icms_Codigo <> '' then
      ParamByName('Icms_Codigo').Value := Icms_Codigo;
    ParamByName('Itnv_custo').Value := Itnv_custo;
    ParamByName('ITNV_OBSERVACAO').value := '';
    ExecProc;
  end;
end;

function TItemNotaVenda.RecuperaDesItem(p_nota_serie, p_nota_numero, p_ent_codigo, p_Item: string): string;
var
  tq: TQuery;
begin
  tq := TQuery.Create(DmInt);
  tq.DatabaseName := DmInt.db.DatabaseName;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select Itnv_Observacao from ItemNotaVenda where Nota_Serie=:a and Nota_Numero=:b and ' +
    'Ent_Codigo=:c and Itnv_Item =:Item');
  tq.Params[0].AsString := p_Nota_Serie;
  tq.Params[1].AsString := p_Nota_Numero;
  tq.Params[2].AsString := p_ent_codigo;
  tq.Params[3].AsString := p_Item;
  tq.Open;
  Result := tq.FieldByName('Itnv_Observacao').AsString;
  Itnv_Observacao := Result;
  tq.Close;
  tq.Free;
end;

function TItemNotaVenda.RecuperaDesItem1(p_nota_serie, p_nota_numero,
  p_ent_codigo, p_Prod: string): string;
var
  tq: TQuery;
begin
  tq := TQuery.Create(DmInt);
  tq.DatabaseName := DmInt.db.DatabaseName;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select Itnv_Observacao from ItemNotaVenda where Nota_Serie=:a and Nota_Numero=:b and ' +
    'Ent_Codigo=:c and Pro_Codigo =:Prod');
  tq.Params[0].AsString := p_Nota_Serie;
  tq.Params[1].AsString := p_Nota_Numero;
  tq.Params[2].AsString := p_ent_codigo;
  tq.Params[3].AsString := p_Prod;
  tq.Open;
  Result := tq.FieldByName('Itnv_Observacao').AsString;
  Itnv_Observacao := Result;
  tq.Close;
  tq.Free;
end;

function TItemNotaVenda.Itens_IPIDiferente(p_nota_serie, p_nota_numero, p_ent_codigo: string; var xaliq_icms: double): boolean;
var
  tq: TQuery;
  ok: boolean;
  xaliq: double;

begin
  tq := TQuery.Create(DmInt);
  tq.DatabaseName := DmInt.db.DatabaseName;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select * from ItemNotaVenda where Nota_Serie=:a and Nota_Numero=:b and ' +
    'Ent_Codigo=:c');
  tq.Params[0].AsString := p_Nota_Serie;
  tq.Params[1].AsString := p_Nota_Numero;
  tq.Params[2].AsString := p_ent_codigo;
  tq.Open;
  ok := false;
  xaliq := tq.fieldbyname('Itnv_aliqipi').AsFloat;
  while not tq.eof do begin
    if xaliq <> tq.fieldbyname('Itnv_aliqipi').AsFloat then
      ok := true;
    tq.next;
  end;
  tq.close;
  tq.free;
  xaliq_icms := xaliq;
  result := ok;
end;

function TItemNotaVenda.RecuperaEstoqueBaixado(p_nota_serie, p_nota_numero, p_ent_codigo, p_Item: string): Boolean;
var
  tq: TQuery;

begin
  tq := TQuery.Create(DmInt);
  tq.DatabaseName := DmInt.db.DatabaseName;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select Itnv_EstoqueBaixado from ItemNotaVenda where Nota_Serie=:a and Nota_Numero=:b and ' +
    'Ent_Codigo=:c and Itnv_Item =:Item');
  tq.Params[0].AsString := p_Nota_Serie;
  tq.Params[1].AsString := p_Nota_Numero;
  tq.Params[2].AsString := p_ent_codigo;
  tq.Params[3].AsString := p_Item;
  tq.Open;
  if tq.FieldByName('Itnv_EstoqueBaixado').AsString = 'N' then begin
    Result := False;
    Itnv_EstoqueBaixado := 'N';
  end else begin
    Result := True;
    Itnv_EstoqueBaixado := 'S';
  end;
  tq.Close;
  tq.Free;
end;

function TItemNotaVenda.RecuperaValorRetornoRemessa;
var
  tq: TQuery;
  Parametros: TParametros;
  xCFOP: string;
begin
  Parametros := TParametros.Create;
  xCFOP := '';
  Parametros.Recuperar('1');
  if Trim(tira_PT(Parametros.CodF_RetRemessaEstado)) <> '' then
    xCFOP := QuotedStr(Parametros.CodF_RetRemessaEstado);
  if Trim(tira_PT(Parametros.CodF_RetRemessaFora)) <> '' then
    if xCFOP <> '' then
      xCFOP := xCFOP + ',' + QuotedStr(Parametros.CodF_RetRemessaFora)
    else
      xCFOP := QuotedStr(Parametros.CodF_RetRemessaFora);
  Parametros.Free;
  tq := TQuery.Create(DmInt);
  tq.DatabaseName := DmInt.db.DatabaseName;
  tq.Active := false;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select sum(Itnv_ValorUnit*Itnv_Quantidade)as Vlr, sum((Itnv_ValorUnit*Itnv_Quantidade)*Itnv_AliqIpi/100) as IPI ' +
    'from ItemNotaVenda where Nota_Serie=:a and Nota_Numero=:b and ' +
    'Ent_Codigo=:c ');
  if xCFOP <> '' then
    tq.sql.add('and Codf_Codigo in (' + xCFOP + ') ');
  tq.Params[0].AsString := p_Nota_Serie;
  tq.Params[1].AsString := p_Nota_Numero;
  tq.Params[2].AsString := p_ent_codigo;
  tq.Open;
  if p_Tipo = 1 then
    Result := tq.FieldByName('Vlr').AsFloat + tq.FieldByName('IPI').AsFloat
  else
    Result := tq.FieldByName('Vlr').AsFloat;
  tq.Close;
  tq.Free;
end;

function TItemNotaVenda.Item_Devolvido(Entidade, nota1, nota2, serie,
  item: string): boolean;
var
  tq: TQuery;

begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.Active := False;
  tq.SQL.Clear;
  tq.Params.Clear;
  tq.SQL.add('Select * from ItemNotaVenda where Ref_numero in (:a,:b) and ' +
    'Ref_serie=:c and Ref_Ent_codigo=:d and Ref_Itnv_Item=:e');
  tq.Params[0].AsString := nota1;
  tq.Params[1].AsString := nota2;
  tq.Params[2].AsString := serie;
  tq.Params[3].AsString := strzero(Entidade, 5);
  tq.Params[4].AsString := item;
  tq.Open;

  if not tq.eof then begin
    result := true;
    Notv_serie := tq.FieldByName('Nota_Serie').AsString;
    Notv_Numero := tq.FieldByName('Nota_Numero').AsString;
    Itnv_quantidade := tq.FieldByName('Itnv_Quantidade').AsFloat;
    item_nota := tq.FieldByname('itnv_item').AsString;
    Pro_codigo := tq.FieldByName('pro_codigo').AsString;

  end else begin
    result := false;

  end;

  tq.close;
  tq.Free;

end;

end.

